package com.ipartek.formacion.gestformwww.controlador;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.*;
import com.ipartek.formacion.gestformwww.modelo.*;
import java.util.ResourceBundle;

/**
 *
 * @author Victor / Aitor; Alvaro / Borja
 * 22/10/10
 */
public class LoginAccion implements Accion{
   
    private final String listarcursos="listar-cursos-accion";
    /**
     * Comprueba si el usuario introducido es correcto y crea la sesión.
     * @param servlet
     * @param request
     * @param response
     * @return Devuelve un AccionRouter que lleva a la página principal al conectarse correctamente
     * y a la página de login en el caso contrario.
     */
    public AccionRouter ejecuta(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response) {
        AccionRouter router = null;
        AccionServlet as=(AccionServlet) servlet;
        HttpSession sesion = request.getSession();
        String aleatorio = (String) sesion.getAttribute("aleatorio");

        if (sesion.getAttribute("usuario") == null || !((Boolean) sesion.getAttribute("usuario"))) {
            if (aleatorio != null) {
                if (request.getParameter("aleatorio") != null) {
                    if (request.getParameter("aleatorio").equals(aleatorio)) {
                        router = new AccionRouter("inicio");
                    } else {
                        sesion.setAttribute("aleatorio", request.getParameter("aleatorio"));
                        router = logueo(servlet, request, response);
                    }
                } else {
                    router = logueo(servlet, request, response);
                }
            } else {
                //      router = new AccionRouter("inicio");
                sesion.setAttribute("aleatorio", request.getParameter("aleatorio"));
                router = logueo(servlet, request, response);
            }
        } else {
            try {
                router=as.getFactory().getAction(as.getNombreClaseRecurso(listarcursos),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
  //            router= factoria.getAction(servlet, listarcursos).ejecuta(servlet, request, response);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(LoginAccion.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                Logger.getLogger(LoginAccion.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(LoginAccion.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return router;
    }

    public Boolean acceder(String usuario, String password, ModeloUsuario modelo, ResourceBundle recurso) {
        if (Verificador.esCorrecto(usuario) && Verificador.esCorrecto(password) && modelo.validarUsuario(usuario, password, recurso)) {
            return true;
        }
        return false;
    }



    public AccionRouter logueo(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response) {
        String usuario = request.getParameter("usuario");
        AccionRouter router=null;
         AccionServlet as=(AccionServlet) servlet;
        String password = request.getParameter("pass");
        HttpSession sesion = request.getSession();
        ModeloUsuario m = (ModeloUsuario) servlet.getServletContext().getAttribute("ModeloUsuario");
        ResourceBundle acciones = (ResourceBundle) servlet.getServletContext().getAttribute("acciones-mapeo");
        ResourceBundle errores = (ResourceBundle) servlet.getServletContext().getAttribute("errores-mapeo");
        if (request.getMethod().equalsIgnoreCase("POST")) {
            if (acceder(usuario, password, m, acciones)) {
                try {
                    sesion.setAttribute("usuario", true);
                   router= as.getFactory().getAction(as.getNombreClaseRecurso(listarcursos),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(LoginAccion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (InstantiationException ex) {
                    Logger.getLogger(LoginAccion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IllegalAccessException ex) {
                    Logger.getLogger(LoginAccion.class.getName()).log(Level.SEVERE, null, ex);
                }
              
            } else {
                request.getSession().setAttribute("error", errores.getString("error-usuario-incorrecto"));
                if (!(Verificador.esCorrecto(usuario) && Verificador.esCorrecto(password))) {
                    request.getSession().setAttribute("error", errores.getString("error-usuario-vacio"));
                }
               router =new AccionRouter("login-incorrecto", false);
            }
        } else {
            router=new AccionRouter("inicio", false);
        }
        
        return router;
    }
    

   
}
